Merge "Add meta=userinfo&uiprop=latestcontrib"
[lhc/web/wiklou.git] / tests / phpunit / includes / specials / pagers / BlockListPagerTest.php
1 <?php
2
3 use MediaWiki\Block\Restriction\PageRestriction;
4 use MediaWiki\Block\Restriction\NamespaceRestriction;
5 use MediaWiki\MediaWikiServices;
6 use Wikimedia\TestingAccessWrapper;
7
8 /**
9 * @group Database
10 * @coversDefaultClass BlockListPager
11 */
12 class BlockListPagerTest extends MediaWikiTestCase {
13
14 /**
15 * @covers ::formatValue
16 * @dataProvider formatValueEmptyProvider
17 * @dataProvider formatValueDefaultProvider
18 * @param string $name
19 * @param string $expected
20 */
21 public function testFormatValue( $name, $expected = null, $row = null ) {
22 $this->setMwGlobals( [
23 'wgEnablePartialBlocks' => false,
24 ] );
25 // Set the time to now so it does not get off during the test.
26 MWTimestamp::setFakeTime( MWTimestamp::time() );
27
28 $value = $name === 'ipb_timestamp' ? MWTimestamp::time() : '';
29 $expected = $expected ?? MWTimestamp::getInstance()->format( 'H:i, j F Y' );
30
31 $row = $row ?: new stdClass;
32 $pager = new BlockListPager( new SpecialPage(), [] );
33 $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
34 $wrappedPager->mCurrentRow = $row;
35
36 $formatted = $pager->formatValue( $name, $value );
37 $this->assertEquals( $expected, $formatted );
38
39 // Reset the time.
40 MWTimestamp::setFakeTime( false );
41 }
42
43 /**
44 * Test empty values.
45 */
46 public function formatValueEmptyProvider() {
47 return [
48 [
49 'test',
50 'Unable to format test',
51 ],
52 [
53 'ipb_timestamp',
54 ],
55 [
56 'ipb_expiry',
57 'infinite<br />0 minutes left',
58 ],
59 ];
60 }
61
62 /**
63 * Test the default row values.
64 */
65 public function formatValueDefaultProvider() {
66 $row = (object)[
67 'ipb_user' => 0,
68 'ipb_address' => '127.0.0.1',
69 'ipb_by_text' => 'Admin',
70 'ipb_create_account' => 1,
71 'ipb_auto' => 0,
72 'ipb_anon_only' => 0,
73 'ipb_create_account' => 1,
74 'ipb_enable_autoblock' => 1,
75 'ipb_deleted' => 0,
76 'ipb_block_email' => 0,
77 'ipb_allow_usertalk' => 0,
78 'ipb_sitewide' => 1,
79 ];
80
81 return [
82 [
83 'test',
84 'Unable to format test',
85 $row,
86 ],
87 [
88 'ipb_timestamp',
89 null,
90 $row,
91 ],
92 [
93 'ipb_expiry',
94 'infinite<br />0 minutes left',
95 $row,
96 ],
97 [
98 'ipb_by',
99 $row->ipb_by_text,
100 $row,
101 ],
102 [
103 'ipb_params',
104 '<ul><li>account creation disabled</li><li>cannot edit own talk page</li></ul>',
105 $row,
106 ]
107 ];
108 }
109
110 /**
111 * @covers ::formatValue
112 * @covers ::getRestrictionListHTML
113 */
114 public function testFormatValueRestrictions() {
115 $this->setMwGlobals( [
116 'wgArticlePath' => '/wiki/$1',
117 'wgScript' => '/w/index.php',
118 ] );
119
120 $pager = new BlockListPager( new SpecialPage(), [] );
121
122 $row = (object)[
123 'ipb_id' => 0,
124 'ipb_user' => 0,
125 'ipb_anon_only' => 0,
126 'ipb_enable_autoblock' => 0,
127 'ipb_create_account' => 0,
128 'ipb_block_email' => 0,
129 'ipb_allow_usertalk' => 1,
130 'ipb_sitewide' => 0,
131 ];
132 $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
133 $wrappedPager->mCurrentRow = $row;
134
135 $pageName = 'Victor Frankenstein';
136 $page = $this->insertPage( $pageName );
137 $title = $page['title'];
138 $pageId = $page['id'];
139
140 $restrictions = [
141 ( new PageRestriction( 0, $pageId ) )->setTitle( $title ),
142 new NamespaceRestriction( 0, NS_MAIN ),
143 // Deleted page.
144 new PageRestriction( 0, 999999 ),
145 ];
146
147 $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
148 $wrappedPager->restrictions = $restrictions;
149
150 $formatted = $pager->formatValue( 'ipb_params', '' );
151 $this->assertEquals( '<ul><li>'
152 // FIXME: Expectation value should not be dynamic
153 // and must not depend on a localisation message.
154 // TODO: Mock the message or consider using qqx.
155 . wfMessage( 'blocklist-editing' )->text()
156 . '<ul><li>'
157 . wfMessage( 'blocklist-editing-page' )->text()
158 . '<ul><li>'
159 . '<a href="/wiki/Victor_Frankenstein" title="'
160 . $pageName
161 . '">'
162 . $pageName
163 . '</a></li></ul></li><li>'
164 . wfMessage( 'blocklist-editing-ns' )->text()
165 . '<ul><li>'
166 . '<a href="/w/index.php?title=Special:AllPages&amp;namespace=0" title="'
167 . 'Special:AllPages'
168 . '">'
169 . wfMessage( 'blanknamespace' )->text()
170 . '</a></li></ul></li></ul></li></ul>',
171 $formatted
172 );
173 }
174
175 /**
176 * @covers ::preprocessResults
177 */
178 public function testPreprocessResults() {
179 // Test the Link Cache.
180 $linkCache = MediaWikiServices::getInstance()->getLinkCache();
181 $wrappedlinkCache = TestingAccessWrapper::newFromObject( $linkCache );
182
183 $links = [
184 'User:127.0.0.1',
185 'User_talk:127.0.0.1',
186 'User:Admin',
187 'User_talk:Admin',
188 ];
189
190 foreach ( $links as $link ) {
191 $this->assertNull( $wrappedlinkCache->badLinks->get( $link ) );
192 }
193
194 $row = (object)[
195 'ipb_address' => '127.0.0.1',
196 'by_user_name' => 'Admin',
197 'ipb_sitewide' => 1,
198 'ipb_timestamp' => $this->db->timestamp( wfTimestamp( TS_MW ) ),
199 ];
200 $pager = new BlockListPager( new SpecialPage(), [] );
201 $pager->preprocessResults( [ $row ] );
202
203 foreach ( $links as $link ) {
204 $this->assertSame( 1, $wrappedlinkCache->badLinks->get( $link ) );
205 }
206
207 // Test Sitewide Blocks.
208 $row = (object)[
209 'ipb_address' => '127.0.0.1',
210 'by_user_name' => 'Admin',
211 'ipb_sitewide' => 1,
212 ];
213 $pager = new BlockListPager( new SpecialPage(), [] );
214 $pager->preprocessResults( [ $row ] );
215
216 $this->assertObjectNotHasAttribute( 'ipb_restrictions', $row );
217
218 $pageName = 'Victor Frankenstein';
219 $page = $this->getExistingTestPage( 'Victor Frankenstein' );
220 $title = $page->getTitle();
221
222 $target = '127.0.0.1';
223
224 // Test Partial Blocks Blocks.
225 $block = new Block( [
226 'address' => $target,
227 'by' => $this->getTestSysop()->getUser()->getId(),
228 'reason' => 'Parce que',
229 'expiry' => $this->db->getInfinity(),
230 'sitewide' => false,
231 ] );
232 $block->setRestrictions( [
233 new PageRestriction( 0, $page->getId() ),
234 ] );
235 $block->insert();
236
237 $result = $this->db->select( 'ipblocks', [ '*' ], [ 'ipb_id' => $block->getId() ] );
238
239 $pager = new BlockListPager( new SpecialPage(), [] );
240 $pager->preprocessResults( $result );
241
242 $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
243
244 $restrictions = $wrappedPager->restrictions;
245 $this->assertInternalType( 'array', $restrictions );
246
247 $restriction = $restrictions[0];
248 $this->assertEquals( $page->getId(), $restriction->getValue() );
249 $this->assertEquals( $page->getId(), $restriction->getTitle()->getArticleID() );
250 $this->assertEquals( $title->getDBKey(), $restriction->getTitle()->getDBKey() );
251 $this->assertEquals( $title->getNamespace(), $restriction->getTitle()->getNamespace() );
252
253 // Delete the block and the restrictions.
254 $block->delete();
255 }
256 }